package com.myqf.demo.反射.bz案例;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Student> stuClazz = Student.class;
        System.out.println("------------通过Class对象 获取单个方法 并执行方法 只能获取public方法------------");
        getMethod(stuClazz);
        System.out.println("------------通过带参构造方法获取对象------------");
        getObject2(stuClazz);
    }

    //通过Class对象 获取单个方法 并执行方法 只能获取public方法
    static void getMethod(Class<Student> clazz) throws Exception {
        Method method = clazz.getMethod("print",int.class);
        Object o = clazz.newInstance();// 通过无参构造 获取对象
        method.invoke(o,123);// 执行方法
        System.out.println("方法名是    "+method.getName());
        System.out.println("方法声明是   "+method);
    }

    //通过无参构造方法获取对象
    static void getObject(Class<Student> clazz) throws Exception {
        Student s = clazz.newInstance();
        s.print("通过无参构造方法获取对象");// 只能访问public方法
    }

    //通过带参构造方法获取对象
    static void getObject2(Class clazz) throws Exception {
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);// 私有时 需要修改可见性
        Object o = declaredConstructor.newInstance("name1");
    }
}
